package com.ruoyi.learn.java.collection;

import java.util.Comparator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapDemo {
    public static void main(String[] args) {
        // 1. 创建默认的TreeMap（按键的自然顺序排序，这里是String的字典顺序）
        TreeMap<String, Integer> scoreMap = new TreeMap<>();

        // 添加元素
        scoreMap.put("Alice", 95);
        scoreMap.put("Bob", 88);
        scoreMap.put("David", 92);
        scoreMap.put("Charlie", 85);
        scoreMap.put("Eve", 90);

        System.out.println("1. 按键的自然顺序排序:");
        // 遍历元素（会按键的自然顺序输出）
        for (Map.Entry<String, Integer> entry : scoreMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }

        // 2. 常用方法示例
        System.out.println("\n2. 常用方法:");
        System.out.println("第一个键值对: " + scoreMap.firstEntry()); // 第一个元素
        System.out.println("最后一个键值对: " + scoreMap.lastEntry()); // 最后一个元素
        System.out.println("Bob的分数: " + scoreMap.get("Bob")); // 获取指定键的值
        System.out.println("键大于等于Charlie的子映射: " + scoreMap.tailMap("Charlie")); // 子映射

        // 3. 使用自定义比较器（按值的降序排序）
        // 注意：TreeMap始终按键排序，这里通过自定义键的比较器实现按值排序的效果
        TreeMap<String, Integer> reverseScoreMap = new TreeMap<>(new Comparator<String>() {
            @Override
            public int compare(String name1, String name2) {
                // 按分数降序排序，如果分数相同则按姓名升序
                int scoreCompare = scoreMap.get(name2).compareTo(scoreMap.get(name1));
                return scoreCompare != 0 ? scoreCompare : name1.compareTo(name2);
            }
        });
        reverseScoreMap.putAll(scoreMap);

        System.out.println("\n3. 按值的降序排序:");
        for (Map.Entry<String, Integer> entry : reverseScoreMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }

        // 4. 导航方法
        System.out.println("\n4. 导航方法:");
        System.out.println("小于David的最大键: " + scoreMap.lowerKey("David")); // 小于指定键的最大键
        System.out.println("大于等于Bob的最小键: " + scoreMap.ceilingKey("Bob")); // 大于等于指定键的最小键
    }
}

